while(1) 与for(;;) 的区别 | 您所在的位置:网站首页 › for a while和in a while › while(1) 与for(;;) 的区别 |
在编程中,我们常常需要用到无限循环,常用的两种方法是while (1) 和 for (;;)。这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码: 编译前: while (1); 编译后: mov eax,1 test eax,eax je foo+23h jmp foo+18h 编译前: for (;;); 编译后: jmp foo+23h 显然,for (;;)指令少,不占用寄存器,而且没有判断、跳转,比while (1)好。这是因为以前的编译器对这两种无线循环的编译处理不一致造成的。 三、 现代编译器(gcc-4.1.1-52-e15)对这两种无线循环的影响? 先看for.c int main(){ for(;;); return 0;} 先看while.c int main() { while(1); return 0;} 用gcc编译 gcc –g –c for.c –o for.o gcc –g –c while.c –o while.o objdump –j .text –Sl while.o > while.txt objdump –j .text –Sl for.o > for.txt结果从汇编来看,for(;;)和while(1)的汇编代码都是 4 : eb fe jmp 4 结论是:它们的汇编指令都是一样的,所以效率也是一样的 单片机的编程中经常用到while(1)死循环来进行轮寻操作,但分析Linux内核源代码时却经常见到for(;;)作为死循环的条件。 两者区别: 区别一 for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(1)死循环里的1被看成表达式,每循环一次都要判断常量1是不是等于零。 区别二 for.c源码: include include |
CopyRight 2018-2019 实验室设备网 版权所有 |